<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <script>
      /*  给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度

      示例 1:

          输入: s = "abcabcbb"
          输出: 3
          解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
      示例 2:

          输入: s = "bbbbb"
          输出: 1
          解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
      示例 3:

          输入: s = "pwwkew"
          输出: 3
          解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
           请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
      示例 4:

          输入: s = ""
          输出: 0


          提示：

      0 <= s.length <= 5 * 104
          s 由英文字母、数字、符号和空格组成
          通过次数910,412提交次数2,475,537

          来源：力扣（LeetCode）
      链接：https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
              著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
      const s = "abcdabcbb"; //star =4    end =4
      /* const len = s.length;
            if (len === 0) return len;
            let left = 0,
              right = 0,
              res = 0;
            const map = new Map();
            while (right < len) {
              if (map.has(s[right])) {
                left = Math.max(left, map.get(s[right]) + 1);
              }
              map.set(s[right], right);
              right++;
              res = Math.max(res, right - left);
            }
            return res;*/
      // 解法一 垃圾解法
      var lengthOfLongestSubstring1 = function (s) {
        const map = new Map();
        let len = 0;
        let result = 0;
        for (let i = 0; i < s.length; i++) {
          const str = s[i];
          if (!map.has(str)) {
            map.set(str, i);
            len++;
          } else {
            if (result < len) result = len;
            i = map.get(s[i]) + 1;
            map.clear();
            len = 0;
          }
        }
        return result < len ? len : result;
      };

      //解法二 滑动窗口
      // "pwwkew"
      var lengthOfLongestSubstring2 = function (s) {
        const len = s.length;
        let left = 0;
        let right = 0;
        let res = 0;
        let map = new Map();
        while (right < len) {
          if (map.has(s[right])) {
            left = Math.max(left, map.get(s[right]) + 1);
          }
          map.set(s[right], right);
          right++;
          res = Math.max(res, right - left);
        }
        return res;
      };

      console.log(lengthOfLongestSubstring2("abcabcbb"));
    </script>
  </body>
</html>
